home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / scheme / pcscheme / geneva / sources.exe / SOURCES / S / STDFUNC.S < prev    next >
Encoding:
Text File  |  1993-10-24  |  5.2 KB  |  187 lines

  1. ; STDFUNC.S
  2. ;************************************************************************
  3. ;*                                    *
  4. ;*        PC Scheme/Geneva 4.00 Scheme code            *
  5. ;*                                    *
  6. ;* (c) 1985-1988 by Texas Instruments, Inc. See COPYRIGHT.TXT        *
  7. ;* (c) 1992 by L. Bartholdi & M. Vuilleumier, University of Geneva    *
  8. ;*                                    *
  9. ;*----------------------------------------------------------------------*
  10. ;*                                    *
  11. ;*        Scheme Standard Functions and Definitions        *
  12. ;*                                    *
  13. ;*----------------------------------------------------------------------*
  14. ;*                                    *
  15. ;* Created by: Terry Caudill        Date: 1985            *
  16. ;* Revision history:                            *
  17. ;* - 18 Jun 92:    Renaissance (Borland Compilers, ...)            *
  18. ;*                                    *
  19. ;*                    ``In nomine omnipotentii dei''    *
  20. ;************************************************************************
  21.  
  22. (define pcs-null-k
  23.   (lambda (ticks eng)
  24.     (error "Null continuation invoked")))
  25.  
  26. (define pcs-success-k pcs-null-k)
  27.  
  28. (define pcs-fail-k '())
  29.  
  30. (define pcs-engine-timeout
  31.   (lambda ()
  32.     (call/cc (lambda (k)
  33.            (let ((fail pcs-fail-k))
  34.          (set! pcs-success-k pcs-null-k)
  35.          (set! pcs-fail-k '())          ; help GC
  36.          (fail (make-engine (lambda () (k '())))))))))
  37.  
  38. (define pcs-kill-engine
  39.   (lambda ()
  40.     (when (not (eq? pcs-success-k pcs-null-k))
  41.       (%stop-timer)
  42.       (set! pcs-success-k pcs-null-k)
  43.       (set! pcs-fail-k '())                 ; help GC
  44.       (display "[Current engine has been killed]")
  45.       (newline))))
  46.  
  47. ; ``The solution to the engine tail recursion problem is to wrap the
  48. ; CALL/CC application in MAKE-ENGINE in an application and pass thunks to
  49. ; ENGINE-K.  This is a very important trick to learn about CALL/CC.
  50. ; Serious CALL/CC hackers should study it carefully.''
  51. ;
  52. ;                         -- Chris Haynes, 10/2/85
  53.  
  54. (define make-engine
  55.   (lambda (thunk)
  56.     (if (proc? thunk)
  57.     (lambda (ticks sk fk)
  58.       ((call/cc
  59.           (lambda (engine-k)
  60.         (when (not (eq? pcs-success-k pcs-null-k))
  61.               (error "Engine already running"))
  62.         (when (or (not (integer? ticks))
  63.               (not (proc? sk))
  64.               (not (proc? fk)))
  65.               (error "Invalid argument to <engine>" ticks sk fk))
  66.         (set! pcs-success-k
  67.               (lambda (v ticks) (engine-k (lambda () (sk v ticks)))))
  68.         (set! pcs-fail-k
  69.               (lambda (v) (engine-k (lambda () (fk v)))))
  70.         (%start-timer ticks)
  71.         (let* ((result (thunk))
  72.                (ticks (%stop-timer)))
  73.           (%stop-timer)
  74.           (set! pcs-success-k pcs-null-k)
  75.           (set! pcs-fail-k '())                 ; help gc
  76.           (error "ENGINE-RETURN not invoked"))))))
  77.     (%error-invalid-operand 'MAKE-ENGINE thunk))))
  78.  
  79. (define engine-return
  80.   (lambda (value)
  81.     (let* ((ticks (%stop-timer))
  82.        (sk pcs-success-k))
  83.       (%stop-timer)
  84.       (set! pcs-success-k pcs-null-k)
  85.       (set! pcs-fail-k '())                             ; help gc
  86.       (sk value ticks))))
  87.  
  88. ;
  89. ;    Miscellaneous Functions
  90. ;
  91.  
  92. (define freesp                        ; FREESP
  93.   (lambda ()
  94.     (%esc 3)))
  95.  
  96. (define %hash                        ; %HASH
  97.   (lambda (symbol)
  98.     (%esc 9 (symbol->string symbol))))
  99.  
  100. (define get-gc-compact-count                ; GET-GC-COMPACT-COUNT
  101.   (lambda ()
  102.     (%esc 21)))
  103.  
  104. (define set-gc-compact-count!                ; SET-GC-COMPACT-COUNT!
  105.   (lambda (value)
  106.     (if (not (integer? value))
  107.       (%error-invalid-operand 'set-gc-compact-count! value)    
  108.       (%esc 22 value))))
  109.  
  110. (define %system-file-name                ; %SYSTEM-FILE-NAME
  111.   (lambda (name)
  112.     (let* ((dir pcs-sysdir)
  113.        (len (string-length dir)))
  114.       (if (zero? len)
  115.       name
  116.       (string-append
  117.           (if (char=? (string-ref dir (- len 1)) #\\)
  118.           dir
  119.           (string-append dir "\\"))
  120.           name)))))
  121.  
  122. ;
  123. ;    Miscellaneous Error type Functions
  124. ;
  125.  
  126. (define %error-invalid-operand            ; %ERROR-INVALID-OPERAND
  127.   (lambda (name opd)
  128.     (error (string-append "Invalid argument to "
  129.               (symbol->string name))
  130.        opd)))
  131.  
  132.  
  133. (define %error-invalid-operand-list        ; %ERROR-INVALID-OPERAND-LIST
  134.   (lambda (name . opds)
  135.     (error (string-append "Invalid argument list for "
  136.               (symbol->string name))
  137.        (cons name opds))))
  138.  
  139.  
  140. (define syntax-error                    ; SYNTAX-ERROR
  141.   (letrec ((prin (lambda (x)
  142.            (newline)(write x))))
  143.     (lambda args
  144.       (newline)
  145.       (display "[Syntax Error] ")
  146.       (display (car args))
  147.       (mapc prin (cdr args))
  148.       (newline)
  149.       (display "[Returning to top level]")
  150.       (newline)
  151.       (reset))))
  152.  
  153.  
  154. (define pcs-clear-registers                ; PCS-CLEAR-REGISTERS
  155.   (lambda ()
  156.     ;; do NOT define with DEFINE-INTEGRABLE !!
  157.     (%clear-registers)    ; calling this routine saves
  158.     '()))               ; needed registers first
  159.  
  160.  
  161. (define pcs-make-label                    ; PCS-MAKE-LABEL
  162.   (lambda (name)
  163.     (set! pcs-local-var-count (+ pcs-local-var-count 1))
  164.     (cons pcs-local-var-count name)))
  165.  
  166.  
  167. ;
  168. ;    Miscellaneous System Definitions
  169. ;
  170.  
  171. (begin
  172.   (define pcs-gc-message #F)        ; nil says use system defaults
  173.   (define pcs-gc-reset #F)
  174.  
  175.   (define standard-input      'CONSOLE)
  176.   (define standard-output     'CONSOLE)
  177.   (define the-empty-stream    (vector 'THE-EMPTY-STREAM))
  178.  
  179.   (define pcs-error-flag         #F)
  180.   (define pcs-binary-output         #T)
  181.  
  182.   (define *error-code*        0)        ; force these to be allocated
  183.   (define *error-message*   '())        ; in USER-GLOBAL-ENVIRONMENT
  184.   (define *irritant*        0)
  185.   (define *user-error-handler* '())
  186. )
  187.